全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
阿里云物联网套件

HTTP连接通信

更新时间:2018-04-02 21:19:41

设备基于HTTP接入

设备认证

设备使用HTTP接入流程:

  • HTTP服务器地址endpoint = https://iot-as-http.cn-shanghai.aliyuncs.com
  • 只支持HTTPS协议。
  • 设备在发送数据前,首先发起认证,获取设备的token。
  • 每次上报数据时,都需要携带token信息,如果token失效需要重新认证获取token,token可以缓存本地,有效期48小时。

1、设备认证(${endpoint}/auth)

  1. 此接口用于传输数据前获取token,发送参数到 只需要请求一次:
  2. POST /auth HTTP/1.1
  3. Host: iot-as-http.cn-shanghai.aliyuncs.com
  4. Content-Type: application/json
  5. body: {"version":"default","clientId":"mylight1000002","signmethod":"hmacsha1","sign":"4870141D4067227128CBB4377906C3731CAC221C","productKey":"ZG1EvTEa7NN","deviceName":"NlwaSPXsCpTQuh8FxBGH","timestamp":"1501668289957"}

参数说明:

  1. Method: POST,支持POST方法
  2. URL: /authurl地址,只支持HTTPS
  3. Content-Type:目前只支持 application/json

body内容:JSON数据格式,具体属性值如下:

字段名称 是否必选 说明
productKey 必选 从iot套件控制台获取
deviceName 必选 从iot套件控制台获取
clientId 必选 客户端自表示Id,64字符内,建议是MAC或SN
timestamp 可选 时间戳,校验时间戳15分钟内请求有效
sign 必选 签名,hmacmd5(deviceSecret,content), content = 将所有提交给服务器的参数(version,sign,signmethod除外), 按照字母顺序排序, 然后将参数值依次拼接,无拼接符号
signmethod 可选 算法类型,hmacmd5或hmacsha1,不填默认hmacmd5
version 可选 版本,不填默认default

返回:

  1. body:
  2. {
  3. "code": 0,//业务状态码
  4. "message": "success",//业务信息
  5. "info": {
  6. "token": "eyJ0eXBlIjoiSldUIiwiYWxnIjoiaG1hY3NoYTEifQ.eyJleHBpcmUiOjE1MDI1MzE1MDc0NzcsInRva2VuIjoiODA0ZmFjYTBiZTE3NGUxNjliZjY0ODVlNWNiNDg3MTkifQ.OjMwu29F0CY2YR_6oOyiOLXz0c8"
  7. }
  8. }

业务状态码说明:

code message 备注
10000 common error 未知错误
10001 param error 请求的参数异常,请按照文档确认参数是否正确
20000 auth check error 设备鉴权失败
20004 update session error 更新失败
40000 request too many 请求次数过多,流控限制

c版本sdk

  • SDK使用IOT_HTTP_Init和IOT_HTTP_DeviceNameAuth来进行认证。

    1. handle = IOT_HTTP_Init(&http_param);
    2. if (NULL != handle) {
    3. IOT_HTTP_DeviceNameAuth(handle);
    4. HAL_Printf("IoTx HTTP Message Sent\r\n");
    5. } else {
    6. HAL_Printf("IoTx HTTP init failed\r\n");
    7. return 0;
    8. }
  1. /**
  2. * @brief Initialize the HTTP client
  3. * This function initialize the data.
  4. *
  5. * @param [in] pInitParams: Specify the init param infomation.
  6. *
  7. * @retval NULL : Initialize failed.
  8. * @retval NOT_NULL : The contex of HTTP client.
  9. * @see None.
  10. */
  11. void *IOT_HTTP_Init(iotx_http_param_t *pInitParams);
  12. /**
  13. * @brief Handle device name authentication with remote server.
  14. *
  15. * @param [in] handle: Pointer of context, specify the HTTP client.
  16. *
  17. * @retval 0 : Authenticate success.
  18. * @retval -1 : Authenticate failed.
  19. * @see iotx_err_t.
  20. */
  21. int IOT_HTTP_DeviceNameAuth(void *handle);

2、上行数据(${endpoint}/topic/${topic})

发送数据到某个topic,${topic}可以在控制台产品管理->消息通信进行设置,比如对于${topic}= /productkey/${deviceName}/pub,如果当前设备名称=device123,那么当前这个设备可以通过 https://iot-as-http.cn-shanghai.aliyuncs.com/topic/productkey/device123/pub 这个地址来上报数据,目前只支持pub权限的topic用于数据上报,示例:

  1. POST /topic/${topic} HTTP/1.1
  2. Host: iot-as-http.cn-shanghai.aliyuncs.com
  3. password:${token}
  4. Content-Type: application/octet-stream
  5. body: ${your_data}

参数说明

  1. Method: POST,支持POST方法
  2. URL: /topic/${topic},${topic}替换为设备对应的topic,只支持HTTPS
  3. Content-Type:目前只支持 application/octet-stream
  4. password: 放在Header中的参数,${token}为设备认证auth接口返回的token

body内容:

  1. 发往${topic}的内容二机制byte[],utf-8编码。

返回值:

  1. body:
  2. {
  3. "code": 0,//业务状态码
  4. "message": "success",//业务信息
  5. "info": {
  6. "messageId": 892687627916247040,
  7. "data": byte[]//可能为空,utf-8编码
  8. }
  9. }

业务状态码说明:

code message 备注
10000 common error 未知错误
10001 param error 请求的参数异常,请按照文档确认参数是否正确
20001 token is expired token失效,需要重新调用auth进行重新鉴权获取token
20002 token is null 请求header无token信息
20003 check token error 根据token获取identify信息失败,需要重新调用auth进行重新鉴权获取token
30001 publish message error 数据上行失败
40000 request too many 请求次数过多,流控限制

c版本sdk

  • SDK使用接口IOT_HTTP_SendMessage来发送和接收数据。

    1. static int iotx_post_data_to_server(void *handle)
    2. {
    3. int ret = -1;
    4. char path[IOTX_URI_MAX_LEN + 1] = {0};
    5. char rsp_buf[1024];
    6. iotx_http_t *iotx_http_context = (iotx_http_t *)handle;
    7. iotx_device_info_t *p_devinfo = iotx_http_context->p_devinfo;
    8. iotx_http_message_param_t msg_param;
    9. msg_param.request_payload = (char *)"{\"name\":\"hello world\"}";
    10. msg_param.response_payload = rsp_buf;
    11. msg_param.timeout_ms = iotx_http_context->timeout_ms;
    12. msg_param.request_payload_len = strlen(msg_param.request_payload) + 1;
    13. msg_param.response_payload_len = 1024;
    14. msg_param.topic_path = path;
    15. HAL_Snprintf(msg_param.topic_path, IOTX_URI_MAX_LEN, "/topic/%s/%s/update",
    16. p_devinfo->product_key, p_devinfo->device_name);
    17. if (0 == (ret = IOT_HTTP_SendMessage(iotx_http_context, &msg_param))) {
    18. HAL_Printf("message response is %s\r\n", msg_param.response_payload);
    19. } else {
    20. HAL_Printf("error\r\n");
    21. }
    22. return ret;
    23. }
  1. /**
  2. * @brief Send a message with specific path to server.
  3. * Client must authentication with server before send message.
  4. *
  5. * @param [in] handle: Pointer of contex, specify the HTTP client.
  6. * @param [in] msg_param: Specify the topic path and http payload configuration.
  7. *
  8. * @retval 0 : Success.
  9. * @retval -1 : Failed.
  10. * @see iotx_err_t.
  11. */
  12. int IOT_HTTP_SendMessage(void *handle, iotx_http_message_param_t *msg_param);

c版本sdk其他接口

  • IOT_HTTP_Disconnect关闭http连接,释放内存。
    1. /**
    2. * @brief close tcp connection from client to server.
    3. *
    4. * @param [in] handle: Pointer of contex, specify the HTTP client.
    5. * @return None.
    6. * @see None.
    7. */
    8. void IOT_HTTP_Disconnect(void *handle);

限制条件及注意事项

本文导读目录