本帖最后由 oneperson 于 2017-5-4 20:43 编辑
一:配置与原理
1、OneNet的简单介绍
OneNET是中国移动物联网有限公司响应“大众创新、万众创业”以及基于开放共赢的理念,面向公共服务自主研发的开放云平台,为各种跨平台物联网应用、行业解决方案提供简便的海量连接、云端存储、消息分发和大数据分析等优质服务,从而降低物联网企业和个人(创客)的研发、运营和运维成本,使物联网企业和个人(创客)更加专注于应用,共建以OneNET为中心的物联网生态环境。 OneNET平台提供设备全生命周期管理相关工具,帮助个人、企业快速实现大规模设备的云端管理;开放第三方API接口,推进个性化应用系统构建;提供定制化“和物”APP,加速个性化智能应用生成。(我是copy的,五毛一条 ~.~ )
对于我们开发来讲,支持多种行业标准协议的解析和转换,如MQTT、Modbus、EDP、http等就可以了。
2、http协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。即我们上网冲浪就少不了使用它。这里是使用的HTTP 1.1,关于网络协议不是很懂,这里程序也就移植别人写好的,这里贴上onenet 的HTTP协议介绍及使用 :点我跳转。
3. 网络接入
这里先选择使用wifi模块,esp8266来接入网络,根据其手册,可以使用透传模式来post http数据。 wifi连接OK后,使用AT+CIPSTART="TCP","183.230.40.33",80 接入移动的服务器,再使用AT+CIPSEND=“数据流长度”发送我们准备好的数据。更多信息可参考文档和例程。
4.硬件软件配置 开发板硬件已经ok,我们需要配置的是STM的软件资源,依旧使用CUBEMX,方便快捷: 勾选定时器6和7
定时器的预分频和计数周期配置,
然后生成代码。
二、软件的编写与网络协议移植
1、在上面的基础上,我们首先根据所需要移植的网络协议部分添加到工程:
修改wifi连接的ssid密码,OneNET的设备ID和apikey
- NET_DEVICE_INFO netDeviceInfo = {"wifi ssid", "password", 0, 0, 0, 0};
- ONETNET_INFO oneNetinfo = {"device id", "your api key", 0, 0, 0, 0};
复制代码
添加定时器中断程序:
修改串口接收中断回调函数:
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
- {
- if(netIOInfo.dataLen >= sizeof(netIOInfo.buf)) netIOInfo.dataLen = 0; //·ÀÖ¹´®¿Ú±»Ë¢±¬
- netIOInfo.buf[netIOInfo.dataLen++] = AT_rxdata;
- AT_rxdata = 0;
- HAL_UART_Receive_IT(&huart2,&AT_rxdata,1);
- }
复制代码
修改net_io.c里的串口发送函数:
copy过来的程序主要需要修改的就是这些地方了,
2、main.c的修改
在我之前工程主函数里添加数据流数组:
main函数里修改如下:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint8_t *dataPtr;
- uint16_t runTime = 0;
- _Bool sendFlag = 0;
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_I2C2_Init();
- MX_USART1_UART_Init();
- MX_USART2_UART_Init();
- MX_TIM6_Init();
- MX_TIM7_Init();
- /* USER CODE BEGIN 2 */
- HAL_TIM_Base_Start_IT(&htim6);
- HAL_TIM_Base_Start_IT(&htim7);
- HAL_UART_Receive_IT(&huart2,&AT_rxdata,1);
- LED_test();
- Dev_Check();
- //ESP8266_Rst();
- HAL_Delay(2000);
- // NET_device_test();
- // AT24C02_test();
- SHT20_init();
- //SHT20_test();
- ADXL345_init();
- NET_DEVICE_IO_Init(); //网络设备IO初始化
- NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式(例如ESP8266要区分AT的返回还是平台下发数据的返回)
- printf("Connect->> SSID: %s, PSWD: %srn"
- "DEVID: %s, APIKEY: %srn"
- , netDeviceInfo.staName, netDeviceInfo.staPass
- , oneNetInfo.devID, oneNetInfo.apiKey);
- netDeviceInfo.reboot = 1;
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- HAL_GPIO_TogglePin(GPIOC,LED_Green_Pin); //led
- // SHT20_test();
- // adxl345_test();
- // HAL_Delay(200);
- // angle_test();
- if(oneNetInfo.netWork == 1)
- {
- if(timInfo.timer6Out - runTime >= 800) //25s一次(25ms中断)
- {
- runTime = timInfo.timer6Out;
- if(sendFlag)
- {
- HAL_TIM_Base_Stop_IT(&htim6);
- OneNet_Status(); //状态检查
- HAL_TIM_Base_Start_IT(&htim6);
- }
- else
- {
- HAL_TIM_Base_Stop_IT(&htim6);
- OneNet_SendData(HTTP_TYPE3, dataStreamLen); //数据发送
- HAL_TIM_Base_Start_IT(&htim6);
- }
- sendFlag = !sendFlag;
- }
- /******************************************************************************
- 发送结果解析
- ******************************************************************************/
- if(oneNetInfo.netWork && NET_DEVICE_Get_DataMode() == DEVICE_DATA_MODE) //当有网络 且 在命令接收模式时
- {
- dataPtr = NET_DEVICE_GetIPD(0); //不等待,获取平台下发的数据
- if(dataPtr != NULL) //如果数据指针不为空,则代表收到了数据
- {
- OneNet_Event(dataPtr); //集中处理
- }
- }
- /******************************************************************************
- 传感器
- ******************************************************************************/
- if(checkInfo.ADXL345_OK == DEV_OK) //只有设备存在时,才会读取值和显示
- {
- Angle_test( ); //采集传感器数据
- Gravity_test( );
- // Lcd1602_DisString(0x80, "X%0.1f,Y%0.1f,Z%0.1f", adxlInfo.incidence_Xf, adxlInfo.incidence_Yf, adxlInfo.incidence_Zf);
- // OLED_DisString6x8(1, 40, "X%0.1f,Y%0.1f,Z%0.1f", adxlInfo.incidence_Xf, adxlInfo.incidence_Yf, adxlInfo.incidence_Zf);
- }
- if(checkInfo.SHT20_OK == DEV_OK) //只有设备存在时,才会读取值和显示
- {
- SHT20_test(); //采集传感器数据
- // Lcd1602_DisString(0xC0, "%0.1fC,%0.1f%%", sht20Info.tempreture, sht20Info.humidity);
- // OLED_DisString6x8(3, 56, "%0.1fC,%0.1f%%", sht20Info.tempreture, sht20Info.humidity);
- }
- /******************************************************************************
- 错误处理
- ******************************************************************************/
- if(faultType != FAULT_NONE) //如果错误标志被设置
- {
- printf("WARN: Fault Processrn");
- Fault_Process(); //进入错误处理函数
- }
- /******************************************************************************
- 数据反馈
- ******************************************************************************/
- if(oneNetInfo.sendData)
- {
- oneNetInfo.sendData = OneNet_SendData(HTTP_TYPE3, dataStreamLen);
- }
- }
- else
- {
- /******************************************************************************
- 初始化网络设备、接入平台
- ******************************************************************************/
- if(!oneNetInfo.netWork && (checkInfo.NET_DEVICE_OK == DEV_OK)) //当没有网络 且 网络模块检测到时
- {
- NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
- if(!NET_DEVICE_Init()) //初始化网络设备,能连入网络
- {
- printf( "Tips: NetWork OKrn");
- oneNetInfo.netWork = 1;
- NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE); //网络设备指令模式
- // Beep_Set(BEEP_ON);
- // HAL_Delay(200);
- // Beep_Set(BEEP_OFF);
- runTime = timInfo.timer6Out;
- }
- }
- /******************************************************************************
- 网络设备检测
- ******************************************************************************/
- if(checkInfo.NET_DEVICE_OK == DEV_ERR) //当网络设备未做检测
- {
- NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
- if(timerCount >= NET_TIME) //如果网络连接超时
- {
- printf( "Tips: Timer Check Errrn");
- NET_DEVICE_Reset(); //复位网络设备
- timerCount = 0; //清零连接超时计数
- faultType = FAULT_NONE; //清除错误标志
- }
- if(!NET_DEVICE_SendCmd("ATrn", "OK")) //网络设备检测
- {
- printf( "NET Device :Okrn");
- checkInfo.NET_DEVICE_OK = DEV_OK; //检测到网络设备,标记
- NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE); //设置为数据收发模式
- }
- else
- printf( "NET Device :Errorrn");
- }
- }
- }
- /* USER CODE END 3 */
- }
复制代码
至此,主要的程序编写与移植就差不多了,吸她的更多细节可以参看例程。
3.OneNet云端数据及应用
1、首先登陆中移动物联网网站,找到右上角开发者中心,注册登陆等省略。
之后选择公开协议创建产品,然后再添加设备:
之后就添加APIkey,这里略过,很简单,另外说下移动那个网页应用真是简单粗暴。
2、创建自己的应用
来摆摆玩吧,太简略了。
选择数据流,如果有数据上传成功,这里是会自己添加创建进来的,当然你也可以提前自己手动添加好,
创建完成后,我们就要准备运行下程序看看结果。当然少不了很多次的烧录修改了调试了,这里略过。
4、结果验证
1、这里贴上程序运行时候的log,比截图好看点:
- Device SHT20 :Ok
- Device ADXL345 :Ok
- Device EEPROM :Ok
- ADXL345 init ok !
- KEY PRESSED!
- interrupt over!
- KEY PRESSED!
- interrupt over!
- xval2: -88.660004 yval2: -77.050003 zval2: -89.699997
- xval2: 22.165001 yval2: 19.262501 zval2: 86.425003
- ADXL345 self test ok !
- Connect->> SSID: test24GHz, PSWD: test0000
- DEVID: ******, APIKEY: ***********************
- NET Device :Ok
- STA Tips: AT+CWMODE=1
- STA Tips: AT+CIPMODE=0
- STA Tips: AT+CWJAP="test24GHz","test0000"
- STA Tips: AT+CIPSTART="TCP","183.230.40.33",80
- Tips: ESP8266 STA OK
- Tips: NetWork OK
- Tips: OneNet_SendData-HTTP_TYPE3
- "IPD" not found
- Tips: Send OK
- ESP8266 Connect OK
- Tips: OneNet_SendData-HTTP_TYPE3
- Tips: Send OK
- ESP8266 Connect OK
- Tips: OneNet_SendData-HTTP_TYPE3
- Tips: Send OK
- ESP8266 Connect OK
- Tips: OneNet_SendData-HTTP_TYPE3
- Tips: Send OK
- ESP8266 Connect OK
复制代码
主要调试就是需要出现如下信息才算上传成功数据:
Tips: OneNet_SendData-HTTP_TYPE3
Tips: Send OK
2、wifi模块端数据收发情况:
AT串口TX:
- AT
- AT+CWMODE=1
- AT+CIPMODE=0
- AT+CWJAP="test24GHz","test0000"
- AT+CWJAP="test24GHz","test0000"
- AT+CWJAP="test24GHz","test0000"
- AT+CIPSTART="TCP","183.230.40.33",80
- AT+CIPSTART="TCP","183.230.40.33",80
- AT+CIPSEND=278
- POST /devices/******/datapoints?type=3 HTTP/1.1
- api-key: ***********************
- Host:api.heclouds.com
- Content-Length:145
- {"Red_Led":0,"Green_Led":0,"Yellow_Led":0,"Blue_Led":0,"beep":0,"temperature":28.60,"humidity":64.83,"Xg":-0.01,"Yg":-0.01,"Zg":1.14,"errType":0}
- AT+CIPSTATUS
- AT+CIPSEND=278
- POST /devices/******/datapoints?type=3 HTTP/1.1
- api-key: ***********************
- Host:api.heclouds.com
- Content-Length:145
- {"Red_Led":0,"Green_Led":0,"Yellow_Led":0,"Blue_Led":0,"beep":0,"temperature":28.64,"humidity":64.85,"Xg":-0.00,"Yg":-0.01,"Zg":1.14,"errType":0}
- AT+CIPSTATUS
- AT+CIPSEND=278
- POST /devices/******/datapoints?type=3 HTTP/1.1
- api-key: ***********************
- Host:api.heclouds.com
- Content-Length:145
复制代码
AT串口RX:
- AT
- OK
- AT+CWMODE=1
- OK
- AT+CIPMODE=0
- OK
- AT+CWJAP="*****","********"
- WIFI DISCONNECT
- AT+CWJAP="******","********"
- busy p...
- WIFI CONNECTED
- WIFI GOT IP
- AT+CIPSTART="TCP","183.230.40.33",80
- busy p...
- OK
- AT+CIPSTART="TCP","183.230.40.33",80
- CONNECT
- OK
- AT+CIPSEND=278
- OK
- >
- Recv 278 bytes
- SEND OK
- +IPD,203:HTTP/1.1 200 OK
- Date: Thu, 04 May 2017 07:23:36 GMT
- Content-Type: application/json
- Content-Length: 26
- Connection: keep-alive
- Server: Apache-Coyote/1.1
- Pragma: no-cache
- {"errno":0,"error":"succ"}
- AT+CIPSTATUS
- STATUS:3
- +CIPSTATUS:0,"TCP","183.230.40.33",80,16784,0
- OK
- AT+CIPSEND=278
- OK
- >
- Recv 278 bytes
- SEND OK
- +IPD,203:HTTP/1.1 200 OK
- Date: Thu, 04 May 2017 07:24:16 GMT
- Content-Type: application/json
- Content-Length: 26
- Connection: keep-alive
- Server: Apache-Coyote/1.1
- Pragma: no-cache
- {"errno":0,"error":"succ"}
复制代码
一切看起来运行良好,网页端也能成功接收到数据
3、网页端应用显示结果:
|