STM32/STM8技术william hill官网
直播中

oneperson

11年用户 164经验值
擅长:可编程逻辑 嵌入式技术 存储技术 处理器/DSP 控制/MCU EDA/IC设计 RF/无线
私信 关注
[经验]

【OneNET麒麟座试用体验】5.OneNET之网络协议HTTP上传

本帖最后由 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-1.jpg

定时器的预分频和计数周期配置,

1-2.jpg 1-3.jpg


然后生成代码。


二、软件的编写与网络协议移植


1、在上面的基础上,我们首先根据所需要移植的网络协议部分添加到工程:

2-1.jpg

修改wifi连接的ssid密码,OneNET的设备ID和apikey

  1. NET_DEVICE_INFO netDeviceInfo = {"wifi ssid", "password", 0, 0, 0, 0};
  2. ONETNET_INFO oneNetinfo = {"device id", "your api key", 0, 0, 0, 0};

添加定时器中断程序:
2-0.jpg

修改串口接收中断回调函数:
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  2. {
  3.     if(netIOInfo.dataLen >= sizeof(netIOInfo.buf))        netIOInfo.dataLen = 0; //·ÀÖ¹´®¿Ú±»Ë¢±¬
  4.     netIOInfo.buf[netIOInfo.dataLen++] = AT_rxdata;
  5.     AT_rxdata = 0;
  6.     HAL_UART_Receive_IT(&huart2,&AT_rxdata,1);
  7. }
修改net_io.c里的串口发送函数:
3-1.jpg

copy过来的程序主要需要修改的就是这些地方了,

2、main.c的修改

在我之前工程主函数里添加数据流数组:

3-0.jpg

main函数里修改如下:
  1. int main(void)
  2. {

  3.     /* USER CODE BEGIN 1 */
  4.     uint8_t *dataPtr;
  5.     uint16_t runTime = 0;
  6.     _Bool sendFlag = 0;
  7.     /* USER CODE END 1 */

  8.     /* MCU Configuration----------------------------------------------------------*/

  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  10.     HAL_Init();

  11.     /* Configure the system clock */
  12.     SystemClock_Config();

  13.     /* Initialize all configured peripherals */
  14.     MX_GPIO_Init();
  15.     MX_I2C2_Init();
  16.     MX_USART1_UART_Init();
  17.     MX_USART2_UART_Init();
  18.     MX_TIM6_Init();
  19.     MX_TIM7_Init();

  20.     /* USER CODE BEGIN 2 */
  21.     HAL_TIM_Base_Start_IT(&htim6);
  22.     HAL_TIM_Base_Start_IT(&htim7);
  23.     HAL_UART_Receive_IT(&huart2,&AT_rxdata,1);
  24.     LED_test();
  25.     Dev_Check();
  26.     //ESP8266_Rst();
  27.     HAL_Delay(2000);
  28.     // NET_device_test();
  29.     // AT24C02_test();
  30.     SHT20_init();
  31.     //SHT20_test();
  32.     ADXL345_init();

  33.     NET_DEVICE_IO_Init();                                                                //网络设备IO初始化
  34.     NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE);                        //设置为命令收发模式(例如ESP8266要区分AT的返回还是平台下发数据的返回)
  35.     printf("Connect->> SSID: %s,   PSWD: %srn"
  36.            "DEVID: %s,     APIKEY: %srn"
  37.            , netDeviceInfo.staName, netDeviceInfo.staPass
  38.            , oneNetInfo.devID, oneNetInfo.apiKey);

  39.     netDeviceInfo.reboot = 1;
  40.     /* USER CODE END 2 */

  41.     /* Infinite loop */
  42.     /* USER CODE BEGIN WHILE */
  43.     while (1)
  44.     {
  45.         /* USER CODE END WHILE */

  46.         /* USER CODE BEGIN 3 */
  47.         HAL_GPIO_TogglePin(GPIOC,LED_Green_Pin);  //led
  48. //        SHT20_test();
  49. //        adxl345_test();
  50. //                           HAL_Delay(200);
  51. //        angle_test();
  52.         if(oneNetInfo.netWork == 1)
  53.         {
  54.             if(timInfo.timer6Out - runTime >= 800)                                                                        //25s一次(25ms中断)
  55.             {
  56.                 runTime = timInfo.timer6Out;
  57.                 if(sendFlag)
  58.                 {
  59.                     HAL_TIM_Base_Stop_IT(&htim6);
  60.                     OneNet_Status();                                                                                                //状态检查
  61.                     HAL_TIM_Base_Start_IT(&htim6);
  62.                 }
  63.                 else
  64.                 {
  65.                     HAL_TIM_Base_Stop_IT(&htim6);
  66.                     OneNet_SendData(HTTP_TYPE3, dataStreamLen);                                                //数据发送
  67.                     HAL_TIM_Base_Start_IT(&htim6);
  68.                 }

  69.                 sendFlag = !sendFlag;
  70.             }

  71.             /******************************************************************************
  72.                                     发送结果解析
  73.             ******************************************************************************/
  74.             if(oneNetInfo.netWork && NET_DEVICE_Get_DataMode() == DEVICE_DATA_MODE)        //当有网络 且 在命令接收模式时
  75.             {
  76.                 dataPtr = NET_DEVICE_GetIPD(0);                                                                                //不等待,获取平台下发的数据
  77.                 if(dataPtr != NULL)                                                                                                        //如果数据指针不为空,则代表收到了数据
  78.                 {
  79.                     OneNet_Event(dataPtr);                                                                                        //集中处理
  80.                 }
  81.             }

  82.             /******************************************************************************
  83.                                     传感器
  84.             ******************************************************************************/
  85.             if(checkInfo.ADXL345_OK == DEV_OK)                                                                                 //只有设备存在时,才会读取值和显示
  86.             {
  87.                 Angle_test( );            //采集传感器数据
  88.                 Gravity_test( );
  89.                 //        Lcd1602_DisString(0x80, "X%0.1f,Y%0.1f,Z%0.1f", adxlInfo.incidence_Xf, adxlInfo.incidence_Yf, adxlInfo.incidence_Zf);
  90.                 //        OLED_DisString6x8(1, 40, "X%0.1f,Y%0.1f,Z%0.1f", adxlInfo.incidence_Xf, adxlInfo.incidence_Yf, adxlInfo.incidence_Zf);
  91.             }
  92.             if(checkInfo.SHT20_OK == DEV_OK)                                                                                 //只有设备存在时,才会读取值和显示
  93.             {                                                               
  94.                 SHT20_test();               //采集传感器数据
  95.                 //        Lcd1602_DisString(0xC0, "%0.1fC,%0.1f%%", sht20Info.tempreture, sht20Info.humidity);
  96.                 //        OLED_DisString6x8(3, 56, "%0.1fC,%0.1f%%", sht20Info.tempreture, sht20Info.humidity);
  97.             }

  98.             /******************************************************************************
  99.                                     错误处理
  100.             ******************************************************************************/
  101.             if(faultType != FAULT_NONE)                                                                                                //如果错误标志被设置
  102.             {
  103.                 printf("WARN:        Fault Processrn");
  104.                 Fault_Process();                                                                                                        //进入错误处理函数
  105.             }

  106.             /******************************************************************************
  107.                                     数据反馈
  108.             ******************************************************************************/
  109.             if(oneNetInfo.sendData)
  110.             {
  111.                 oneNetInfo.sendData = OneNet_SendData(HTTP_TYPE3, dataStreamLen);
  112.             }
  113.         }
  114.         else
  115.         {
  116.             /******************************************************************************
  117.                                     初始化网络设备、接入平台
  118.             ******************************************************************************/
  119.             if(!oneNetInfo.netWork && (checkInfo.NET_DEVICE_OK == DEV_OK))                        //当没有网络 且 网络模块检测到时
  120.             {
  121.                 NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE);                                                        //设置为命令收发模式

  122.                 if(!NET_DEVICE_Init())                                                                                                //初始化网络设备,能连入网络
  123.                 {
  124.                     printf( "Tips:        NetWork OKrn");

  125.                     oneNetInfo.netWork = 1;

  126.                     NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE);                                                //网络设备指令模式

  127.                     //  Beep_Set(BEEP_ON);
  128.                     //  HAL_Delay(200);
  129.                     //  Beep_Set(BEEP_OFF);

  130.                     runTime = timInfo.timer6Out;
  131.                 }
  132.             }
  133.             /******************************************************************************
  134.                                     网络设备检测
  135.             ******************************************************************************/
  136.             if(checkInfo.NET_DEVICE_OK == DEV_ERR)                                                                         //当网络设备未做检测
  137.             {
  138.                 NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE);                                                        //设置为命令收发模式

  139.                 if(timerCount >= NET_TIME)                                                                                         //如果网络连接超时
  140.                 {
  141.                     printf( "Tips:                Timer Check Errrn");

  142.                     NET_DEVICE_Reset();                                                                                                //复位网络设备
  143.                     timerCount = 0;                                                                                                        //清零连接超时计数
  144.                     faultType = FAULT_NONE;                                                                                        //清除错误标志
  145.                 }

  146.                 if(!NET_DEVICE_SendCmd("ATrn", "OK"))                                                                //网络设备检测
  147.                 {

  148.                     printf( "NET Device :Okrn");
  149.                     checkInfo.NET_DEVICE_OK = DEV_OK;                                                                //检测到网络设备,标记
  150.                     NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE);                                                //设置为数据收发模式
  151.                 }
  152.                 else
  153.                     printf( "NET Device :Errorrn");
  154.             }
  155.         }
  156.     }
  157.     /* USER CODE END 3 */

  158. }
至此,主要的程序编写与移植就差不多了,吸她的更多细节可以参看例程。

3.OneNet云端数据及应用

1、首先登陆中移动物联网网站,找到右上角开发者中心,注册登陆等省略。
之后选择公开协议创建产品,然后再添加设备:
3-2.jpg

之后就添加APIkey,这里略过,很简单,另外说下移动那个网页应用真是简单粗暴。

2、创建自己的应用

3-3.jpg
来摆摆玩吧,太简略了。
4-1.jpg

选择数据流,如果有数据上传成功,这里是会自己添加创建进来的,当然你也可以提前自己手动添加好,

4-2.jpg

创建完成后,我们就要准备运行下程序看看结果。当然少不了很多次的烧录修改了调试了,这里略过。

4、结果验证

1、这里贴上程序运行时候的log,比截图好看点:

  1. Device SHT20 :Ok
  2. Device ADXL345 :Ok
  3. Device EEPROM :Ok
  4. ADXL345 init ok !
  5. KEY PRESSED!
  6. interrupt over!
  7. KEY PRESSED!
  8. interrupt over!
  9. xval2: -88.660004 yval2: -77.050003 zval2: -89.699997
  10. xval2: 22.165001 yval2: 19.262501 zval2: 86.425003
  11. ADXL345 self test ok !
  12. Connect->> SSID: test24GHz,   PSWD: test0000
  13. DEVID: ******,     APIKEY: ***********************
  14. NET Device :Ok
  15. STA Tips:        AT+CWMODE=1
  16. STA Tips:        AT+CIPMODE=0
  17. STA Tips:        AT+CWJAP="test24GHz","test0000"
  18. STA Tips:        AT+CIPSTART="TCP","183.230.40.33",80
  19. Tips:        ESP8266 STA OK
  20. Tips:        NetWork OK
  21. Tips:        OneNet_SendData-HTTP_TYPE3
  22. "IPD" not found
  23. Tips: Send OK
  24. ESP8266 Connect OK
  25. Tips:        OneNet_SendData-HTTP_TYPE3
  26. Tips: Send OK
  27. ESP8266 Connect OK
  28. Tips:        OneNet_SendData-HTTP_TYPE3
  29. Tips: Send OK
  30. ESP8266 Connect OK
  31. Tips:        OneNet_SendData-HTTP_TYPE3
  32. Tips: Send OK
  33. ESP8266 Connect OK

主要调试就是需要出现如下信息才算上传成功数据:
Tips:        OneNet_SendData-HTTP_TYPE3
Tips: Send OK

2、wifi模块端数据收发情况:
AT串口TX:
  1. AT
  2. AT+CWMODE=1
  3. AT+CIPMODE=0
  4. AT+CWJAP="test24GHz","test0000"
  5. AT+CWJAP="test24GHz","test0000"
  6. AT+CWJAP="test24GHz","test0000"
  7. AT+CIPSTART="TCP","183.230.40.33",80
  8. AT+CIPSTART="TCP","183.230.40.33",80
  9. AT+CIPSEND=278
  10. POST /devices/******/datapoints?type=3 HTTP/1.1
  11. api-key: ***********************
  12. Host:api.heclouds.com
  13. Content-Length:145

  14. {"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}
  15. AT+CIPSTATUS
  16. AT+CIPSEND=278
  17. POST /devices/******/datapoints?type=3 HTTP/1.1
  18. api-key: ***********************
  19. Host:api.heclouds.com
  20. Content-Length:145

  21. {"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}
  22. AT+CIPSTATUS
  23. AT+CIPSEND=278
  24. POST /devices/******/datapoints?type=3 HTTP/1.1
  25. api-key: ***********************
  26. Host:api.heclouds.com
  27. Content-Length:145
AT串口RX:
  1. AT

  2. OK
  3. AT+CWMODE=1

  4. OK
  5. AT+CIPMODE=0

  6. OK
  7. AT+CWJAP="*****","********"
  8. WIFI DISCONNECT
  9. AT+CWJAP="******","********"
  10. busy p...
  11. WIFI CONNECTED
  12. WIFI GOT IP
  13. AT+CIPSTART="TCP","183.230.40.33",80
  14. busy p...

  15. OK
  16. AT+CIPSTART="TCP","183.230.40.33",80
  17. CONNECT

  18. OK
  19. AT+CIPSEND=278

  20. OK
  21. >
  22. Recv 278 bytes

  23. SEND OK

  24. +IPD,203:HTTP/1.1 200 OK
  25. Date: Thu, 04 May 2017 07:23:36 GMT
  26. Content-Type: application/json
  27. Content-Length: 26
  28. Connection: keep-alive
  29. Server: Apache-Coyote/1.1
  30. Pragma: no-cache

  31. {"errno":0,"error":"succ"}
  32. AT+CIPSTATUS
  33. STATUS:3
  34. +CIPSTATUS:0,"TCP","183.230.40.33",80,16784,0

  35. OK
  36. AT+CIPSEND=278

  37. OK
  38. >
  39. Recv 278 bytes

  40. SEND OK

  41. +IPD,203:HTTP/1.1 200 OK
  42. Date: Thu, 04 May 2017 07:24:16 GMT
  43. Content-Type: application/json
  44. Content-Length: 26
  45. Connection: keep-alive
  46. Server: Apache-Coyote/1.1
  47. Pragma: no-cache

  48. {"errno":0,"error":"succ"}


一切看起来运行良好,网页端也能成功接收到数据

3、网页端应用显示结果:
5-1.jpg

数据上传显示OK.

程序备份:
test04-3.rar (708.57 KB)
(下载次数: 3, 2017-5-4 20:42 上传)

回帖(1)

newphj

2018-7-17 15:39:50
下载看一下,谢谢楼主
举报

更多回帖

发帖
×
20
完善资料,
赚取积分