引言
最近在上智能物联网的课程,讲授基于hi3861的OpenHarmony编程,所以尝试一下使用大模型工具生成相关的代码,看看效果如何。提问的方式比较简单粗暴:
在OpenHarmony的hi3861平台上,如何编程访问https的网站?
Kimi
Kimi是我用得最多的平台,它经过文献搜索之后给出如下答案。
在OpenHarmony的hi3861平台上访问https的网站,通常需要以下几个步骤:
Wi-Fi连接:首先,确保hi3861开发板已经连接到互联网。这通常涉及到扫描可用的Wi-Fi网络,然后连接到一个具体的网络。可以通过以下API实现:
c
wifi_scan(NULL); // 扫描周边可用的Wi-Fi网络 wifi_connect(ssid, key); // 连接到指定的Wi-Fi网络
其中
ssid
是网络名称,key
是网络密钥。连接成功后,可以通过wifi_set静态ip
设置静态IP地址,以保证设备的网络连接稳定性。配置网络参数:在进行网络编程之前,需要根据你的无线路由、Linux系统IP修改
net_params.h
文件的相关代码,包括热点名称、热点密码、服务器IP地址和端口号等。使用LwIP Socket API编程:OpenHarmony的hi3861平台支持LwIP协议栈,可以使用LwIP的Socket API进行网络编程。例如,创建一个UDP客户端进行网络通信的步骤如下:
- 创建Socket:
socket()
- 设置目标服务器地址和端口:
sockaddr_in
- 发送和接收数据:
sendto()
recvfrom()
- 关闭Socket:
close()
具体的代码实现可以参考提供的示例。
访问HTTPS网站:对于HTTPS的支持,通常需要一个SSL/TLS库来处理加密和证书验证。在嵌入式设备上,这通常意味着使用一个轻量级的SSL库,如wolfSSL、mbedTLS等。你需要集成这样的库到你的OpenHarmony项目中,并使用它来创建一个安全的连接。
调试和验证:在开发过程中,可以通过printf打印日志或者通过asm文件定位panic问题来进行调试验证。
请注意,由于hi3861是一个轻量级的IoT设备,它的资源有限,因此可能需要对SSL/TLS库进行适当的配置以适应其资源限制。同时,确保你的OpenHarmony版本支持你选择的SSL/TLS库。由于搜索结果中没有直接提供如何在OpenHarmony上实现HTTPS的具体代码,你可能需要参考官方文档或者社区论坛来获取更多信息。
Kimi的大思路是对的,但是没有给出具体的代码,主要的原因大概是网络上找不到现成的例子。
文心一言
同样的问题甩给文心一言后,它也很快地给出了答案。
在OpenHarmony的hi3861平台上访问HTTPS网站,你通常需要用到一些网络通信库来处理HTTP请求和SSL/TLS加密。由于OpenHarmony是一个轻量级的操作系统,很多标准的库可能需要进行适配或者移植。以下是一个基本的步骤指南,用于在OpenHarmony的hi3861平台上编程访问HTTPS网站。
1. 准备工作
- 开发环境:确保你已经设置好OpenHarmony的开发环境,包括必要的SDK和工具链。
- 了解hi3861平台:熟悉hi3861的硬件规格和OpenHarmony在该平台上的支持情况。
2. 选择和移植库
OpenHarmony可能没有直接提供完整的HTTP和SSL/TLS库,因此你可能需要选择并移植这些库。
可能的库选择
- libcurl:一个支持多种协议的客户端URL传输库,包括HTTPS。
- mbedTLS:一个轻量级的SSL/TLS库,适合嵌入式系统。
- OpenSSL:一个功能强大的SSL/TLS库,但可能较为庞大。
移植步骤
- 下载源码:从库的官方网站下载源码。
- 配置编译:根据hi3861的编译环境,配置库的编译选项。
- 编译库:使用OpenHarmony的编译工具链编译库文件。
- 集成库:将编译好的库文件集成到你的OpenHarmony项目中。
3. 编写代码
以下是一个使用libcurl访问HTTPS网站的示例代码:
c复制代码
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
// 回调函数,用于处理从服务器接收到的数据
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
((char *)userp)[0] = '\0';
strncat((char *)userp, (char *)contents, size * nmemb);
return size * nmemb;
}
int main(void)
{
CURL *curl;
CURLcode res;
char readBuffer[1024 * 1024]; // 缓冲区,用于存储从服务器接收到的数据
// 初始化libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
// 设置URL
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
// 设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
// 设置回调函数的数据参数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)readBuffer);
// 执行请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
else
printf("Response: %s\n", readBuffer);
// 清理
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
4. 编译和运行
- 修改CMakeLists.txt:将你的代码和依赖的库添加到CMakeLists.txt中。
- 编译项目:使用OpenHarmony的编译工具链编译你的项目。
- 烧录和运行:将编译好的固件烧录到hi3861开发板上,并运行程序。
5. 调试和测试
- 查看日志:使用OpenHarmony提供的日志工具查看程序的输出和调试信息。
- 测试不同URL:尝试访问不同的HTTPS网站,确保程序能够正确处理各种情况。
注意事项
- 内存限制:hi3861是一个资源有限的嵌入式平台,注意控制内存使用。
- 安全性:确保你使用的SSL/TLS库是安全的,并经常更新以修复可能的安全漏洞。
- 兼容性:测试你的程序在不同版本的OpenHarmony和hi3861硬件上的兼容性。
通过以上步骤,你应该能够在OpenHarmony的hi3861平台上编程访问HTTPS网站。如果遇到具体问题,可以查阅相关库的文档和OpenHarmony的开发者指南。
文心一言给的大方向也还是可以,但是这里面有些问题。一个是libcurl是不是可以在hi3861上运行,这个不确定,另一个是它没有考虑到OpenHarmony所使用的编译系统并不是CMake。所以它给的解答可能在Linux上没有问题,但是在hi3861上不一定能用。
星火飞码
星火飞码(iFlyCode)是讯飞星火提供的VSCode插件,它是针对编程设计的,所以我也向它提了同样的问题。
OpenHarmony是由华为开发的开源物联网操作系统,它支持多种芯片和硬件平台。在hi3861平台上访问HTTPS网站需要使用相关的网络库和任务处理机制。下面我将为您生成一个示例代码框架,演示如何在OpenHarmony上实现这一功能:
首先,您需要在系统中包含必要的网络库,并初始化相关配置。然后,创建一个任务来执行HTTPS请求,并处理响应数据。
新建插入复制比较
#include <ohos/network/netmgr.h>
#include <ohos/network/https.h>
using namespace OHOS;
class MyHttpsTask : public ::OHOS::AAFwk::Ability
{
public: MyHttpsTask() = default; ~MyHttpsTask() override = default; void OnStart(const Want &want) override { NetmgrStub::GetInstance().Connect(want);
}
void OnConnect() override { // 初始化网络配置 s_netMgr.SetMaxRecommendConnectionCount(5); s_netMgr.SetKeepAliveTime(30); s_netMgr.SetGlobalProxy(nullptr); // 创建并执行HTTPS请求 std::shared_ptr<HttpsConnection> connection = HttpsConnection::Create(/*URL*/ "https://www.example.com", this); if (connection != nullptr) { connection->SendRequest(Want{}); } } void OnResponse(const HttpsResponse &response) override { // 处理HTTPS响应 if (response.GetErrorCode() == ERR_OK) { std::string responseText = response.ReadAll(); // 处理响应文本 } else { // 错误处理 } } private: static NetManager s_netMgr; }; NetManager MyHttpsTask::s_netMgr;在这个示例中,我们通过
HttpsConnection
类来实现对HTTPS网站的访问,并实现了OnResponse
方法来处理服务器返回的响应数据。请注意,您需要根据实际需求修改URL和其他相关参数。
它的回答显然不是针对hi3861的,没法用。
结语
从目前看,针对像hi3861这样比较小众的平台,大模型工具的表现不是太好。