OneMO模组说|技术学堂-ML307A开发指南(二) OpenCPU HTTP及HTTPS使用介绍

HTTP是一个简单的请求-响应协议在物联网设备中使用非常广泛可向HTTP服务器获取数据、推送数据、下载服务器上的文件、OTA远程升级等ML307A OpenCPU SDK提供的HTTP API接口最大支持创建4路HTTP实例,且支持GET、POST和PUT等常用请求方法。 本文从使用流程demo代码OneNET平台对接示例及常见问题四个方面对ML307A模组OpenCPU的HTTPHTTPS功能进行了介绍

一、HTTP使用流程解析

以下流程图为使用ML307A OpenCPU SDK HTTP功能时的常见流程及相关函数接口介绍。

图1 HTTP接口函数使用流程

1介绍了使用HTTP同步接口cm_httpclient_sync_request()与HTTP服务器交互的常规流程,可结合ML307A_OpenCPU_Standard_x.x.x_release\examples\http\

src\ cm_demo_http.c中的demo示例程序加深理解。

HTTP功能包含的全部函数接口详细定义可在include\cmiot\cm_http.h中查看

二、HTTP demo代码解析

SDK中有一个HTTP常规使用方法的demo程序,可在cm_demo_http.c文件中查看,下面我们详细看一下。

2.1 创建HTTP客户端实例

2 创建HTTP客户端实例函数

(1) 第一步使用cm_httpclient_create()在模组本地端创建一个HTTP实例,此函数有三个参数,第一个参数为HTTP服务器地址url,可使用完整域名或iP:端口的形式,注意url地址前必须加上HTTP或者HTTPS,demo中访问的服务器为百度;

(2) 第二个参数为客户端相关回调函数,demo中使用cm_httpclient_sync_

request()同步接口可忽略该参数,传NULL即可;

(3) 第三个参数为实例句柄,若HTTP实例创建成功,则会返回一串随机的数字,作为这个实例的标识号,若创建失败则返回NULL。

2.2 HTTP客户端实例参数设置

3 HTTP客户端实例参数设置

  1. 第二步使用cm_httpclient_cfg_t结构体和cm_httpclient_set_cfg()函数对第一步创建的HTTP客户端实例进行参数设置;

(2) demo中设置的主要参数有:

①是否使用SSL,本例访问百度,需要使用HTTPS,故此参数为true;

②SSL的索引号,当访问HTTPS服务器时设置;

③设置HTTP连接超时时间及请求响应超时时间,demo中均使用默认时间;具体如下图所示:

4 HTTP超时时间默认值

④设置DNS解析优先级,demo中设置为1代表ipv6解析优先。

2.3 HTTP客户端实例SSL设置及CA证书

5 SSL设置及CA证书

  1. 第三步使用cm_ssl_setopt()函数设置SSL验证方式及设置CA证书,此函数有3个参数如下:

①第一个参数ssl_id是ssl通道号,范围为0-5,demo中ssl_id为2(第二步中client_cfg.ssl_id设置为2 );

②第二个参数cm_ssl_param_type_e是SSL配置项类型,根据cm_ssl_param_type_e中不同的枚举类型配置SSL的各个参数,demo中主要配置CM_SSL_PARAM_VERIFY和CM_SSL_PARAM_CA_CERT这两项,demo中设置SSL验证方式为1,单向验证。

6 SSL配置类型结构体

  1. 注意若要访问的HTTP服务器不带ssl,即不是以HTTPS开头,则不需要进行此步配置。

2.4 使用同步接口发送HTTP请求

7 同步接口方式HTTP请求函数

  1. 使用cm_httpclient_sync_param_t设置HTTP同步接口输入参数,此结构体中含请求类型GETPOSTPUT等,请求路径,及发送给服务器的请求数据(POST时发送给服务器的content),demo中请求类型为GET,当为GET方法时,必须设置请求路径(本例中路径为根目录“/”),且第三个参数“数据长度”为0,第四个参数“数据”为NULL;

8 HTTP同步接口输入参数

  1. 使用cm_httpclient_sync_response_t结构体接收HTTP 同步接口响应数据;此结构体用于接收HTTP服务器发给模组的响应结果数据,包含响应结果码、响应报头,响应消息体等数据;

9 HTTP同步接口响应参数结构体

(3) 使用cm_httpclient_sync_request()函数向HTTP服务器发送请求,此函数为同步接口。函数接口包括客户端实例句柄client,以及上面配置好的请求输入参数param和响应结果response。

2.5 HTTP响应结果

2.4中发送的HTTP请求参数无错误,则模组会收到HTTP服务器响应结果,可将收到的response结构体中包含的服务器返回数据进行处理或打印输出

10 HTTP响应结果打印输出

(1) demo中打印了response的三个参数,分别为请求成功时的响应结果码、响应报头长度响应消息体长度;

(2) 还可以将response剩余两个参数打印出来,即打印HTTP服务器返回的response_header和response_content,即为响应报头和响应消息体。

2.6 释放HTTP响应数据

当程序已将HTTP服务器返回的完整数据处理完后,需要释放这些数据,使用下图中的cm_httpclient_sync_free_data()函数进行释放。

11 释放HTTP响应数据

2.7 终止HTTP连接或删除客户端实例

当本次HTTP请求结束时需要终止HTTP连接以及删除客户端实例,以释放模组本地资源或者供其他线程使用。

12 终止HTTP连接及删除实例

删除HTTP本地实例注意事项:

(1)cm_httpclient_delete()接口会将close socket(HTTP)操作发送至eloop模块中让其执行close socket操作;

(2)本接口返回成功代表操作已发送至eloop中,不代表已完成实例删除操作;

(3)用户连续两次调用本接口时建议中间保证100ms以上的延时。

以上,就是HTTP demo示例程序的解析。

三、使用HTTP与OneNET平台对接示例

下面我们使用ML307A OpenCPU SDK提供的 HTTP函数接口与OneNET平台进行对接,整体程序流程与上述HTTP demo代码几乎一致,这里我们解析其中存在差异的部分,以下为完整步骤及程序流程解析。

3.1 平台侧创建HTTP产品及设备

首先,登录OneNET平台https://open.iot.10086.cn/,进入首页右上角“开发者中心”,点击左上角“全部产品服务”-“基础服务”-“多协议接入”,进入多协议接入页面后点击上面菜单的“HTTP”,然后开始创建产品,添加设备,完成以上步骤后即可继续在SDK中设置登录OneNET需要的相关HTTP客户端实例参数。

3.2 修改服务器地址为OneNET HTTP服务器地址

“OneNET平台-多协议接入-HTTP协议”的地址为http://api.heclouds.com,因此有如下修改

13 OneNET平台HTTP服务器地址

3.3 HTTP客户端实例参数设置

 因为“OneNET平台-多协议接入-HTTP协议”为HTTP普通连接,所以将ssl_enable参数设置为false,同时跳过HTTP客户端实例SSL设置。

14 OneNET平台无需设置SSL

3.4 HTTP请求通用报头

不同于第二章的GET请求,我们需要POST发送数据给OneNET平台,所以需要设置OneNET规定的通用报头,即我们在OneNET平台上创建的产品masterapi-key,用作登录OneNET时的鉴权,因此需要增加一个设置通用报头的函数,如下图所示

15 设置通用报头函数接口

16 登录OneNET平台所需的通用报头参数

3.5 使用同步接口发送HTTP POST请求

不同于第二章的GET请求,当需要向OneNET POST上发数据时cm_httpclient_

sync_param_t同步接口输入参数需要做三处修改:

  1. 设置HTTP请求类型为HTTPCLIENT_REQUEST_POST;
  2. 设置POST请求路径为/devices/1044214984/datapoints?type=3,其中1044214984为OneNET平台上的设备ID;
  3. 向OneNET平台POST数据长度为24, 数据string_http="{\"temp123\":

\"8834rteedd\"}",此处数据长度和数据内容可根据需要修改。

17 OneNET平台POST的内容

18 OneNET平台HTTP POST参数设置

3.5 HTTP响应结果打印

此处将OneNET平台返回的HTTP响应结果包括响应结果码,响应报头长度、响应消息体长度,响应报头内容,响应消息体内容全部打印出来,打印程序及结果如下:

19 OneNET平台HTTP响应结果打印

20 OneNET平台HTTP响应结果示例

以上就是,使用HTTP与OneNET平台对接的完整程序流程解析

四、常见问题

1、cm_httpclient_sync_request()同步函数接口适用于哪些应用场景,使用时有什么注意事项?

发送http请求同步接口,只可用于非chunk模式发送,需先创建实例并完成相关参数设置,响应结果中的数据未内部动态分配空间,使用完后可通过cm_httpclient_

sync_free_data接口释放,下次请求时也会自动释放。

2、使用HTTP客户端参数设置时有什么注意事项?

  客户端参数设置,创建实例后设置,请求过程中不可设置;服务器应答重定向信息的情况下,采用cm_httpclient_set_cfg()配置的参数连接重定向的服务器。

3、使用HTTP实例的通用报头函数时有什么注意事项?

设置通用报头,实例期间有效,未设置时,发送请求时将自动添加默认报头。直接引用header指针,不做拷贝,需保证请求过程中不做修改和释放,如外部释放,也需调用cm_httpclient_custom_header_free接口释放内部设置。

4、什么情况下需要使用HTTP实例的特定报头函数,与通用报头函数有何区别?

设置特定报头,用于设置报头中,在不同请求时存在变化的字段,如果通用报头中同样存在该字段,将在发送请求时自动替换为当前设置值。直接引用header指针,不做拷贝,需保证请求过程中不做修改和释放,如外部释放,也需调用cm_httpclient_

specific_header_free接口释放内部设置。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 用 sklearn 库中的 KMeans 算法进行聚类分析后,可以使用 Matplotlib 库进行可视化。可以使用 scatter 方法绘制数据点,并使用不同颜色表示不同类别。代码示例如下: ``` from sklearn.cluster import KMeans from matplotlib import pyplot as plt # 进行 KMeans 聚类 kmeans = KMeans(n_clusters=3) kmeans.fit(X) # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_) plt.show() ``` 其中 X 是待聚类数据,n_clusters 是聚类数量。 ### 回答2: k-means是一种常见的聚类算法,在机器学习中应用广泛。sklearn库中提供了k-means算法的实现,同时也支持对聚类结果进行可视化展示,方便用户观察聚类结果并进一步分析。 在sklearn中,通过导入sklearn.cluster中的KMeans类来使用k-means算法。在使用KMeans类前,需要指定算法参数,如簇类数量、初始质心位置等。具体参数配置可参照官方文档进行设置。 针对聚类结果的可视化展示,sklearn提供了多种方法。以下介绍两种常见的可视化方法: 1. 绘制散点图 将聚类结果用散点图进行可视化是一种常见方法。在绘制散点图时,通常根据聚类簇别,对不同数据点进行颜色编码,以便用户能够更清晰地区分不同类别的数据点。代码示例: ``` import matplotlib.pyplot as plt # 聚类簇别结果保存在labels中 # 聚类中心位置保存在cluster_centers_中 # X为原始数据 for i in range(n_clusters): plt.scatter(X[labels == i, 0], X[labels == i, 1], s=30, label='Cluster %d' % (i+1)) plt.scatter(cluster_centers_[:, 0], cluster_centers_[:, 1], marker='*', s=200, label='Centroids') plt.legend() plt.show() ``` 2. 绘制决策边界 决策边界用于划分不同聚类簇别的区域,相邻区域的簇别不同。通过绘制决策边界,可以更清晰地展示不同聚类簇别的分布情况。代码示例: ``` from sklearn.metrics import pairwise_distances_argmin # 聚类簇别结果保存在labels中 # X为原始数据 def plot_kmeans(kmeans, X, n_clusters=3, rseed=0, ax=None): labels = kmeans.fit_predict(X) # 绘制决策边界 ax = ax or plt.gca() ax.axis('equal') ax.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2) # 绘制聚类中心 centers = kmeans.cluster_centers_ radii = [cdist(X[labels == i], [center]).max() for i, center in enumerate(centers)] for c, r in zip(centers, radii): ax.add_patch(plt.Circle(c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1)) kmeans = KMeans(n_clusters=3, random_state=0) plot_kmeans(kmeans, X) plt.show() ``` 无论是绘制散点图还是绘制决策边界,k-means聚类的可视化展示都能够为用户提供全局性的聚类结果,方便用户进一步分析和探索数据。 ### 回答3: 机器学习中的K均值聚类算法是一种无监督学习方法,可用于将数据点分成不同的类别。在scikit-learn(sklearn)包中,我们可以使用KMeans类来实现K均值聚类算法,同时通过可视化的方式更直观地了解到该算法的结果。 首先,我们需要生成一些数据。在这里,可以通过使用make_blobs函数生成随机的数据点,并将其分成不同的类别。然后,我们可以使用KMeans类对这些数据点进行聚类分析。在KMeans类中,我们可以设置聚类的数量(也称为k值)和迭代次数(max_iter)。例如,我们可以设置k值为3,迭代次数为100,并使用fit_predict函数进行聚类,将每个数据点分配到其所属的簇中。 接下来,我们可以使用matplotlib库来可视化聚类结果。对于维数据,我们可以使用散点图来显示每个数据点所属的簇。我们还可以使用不同的颜色来区分不同的簇,使得结果更加直观。在维数据的情况下,可以使用plt.scatter函数来绘制散点图,使用不同的颜色为不同的簇分配不同的值。我们还可以使用KMeans类的cluster_centers_属性来显示每个簇的中心点,用不同的标记区分每个簇的中心点。 总之,通过使用sklearn kmeans聚类可视化,我们可以更好地了解K均值聚类算法的工作原理,并更好地理解每个数据点所属的不同簇。此外,该过程也可以帮助我们选择最佳的k值和max_iter值,以便获得更好的聚类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值