开发背景
目前在做的一个项目需要检测人特征,并在成功检测后实现图片上云等操作,通信硬件选择了esp32,几经折腾,最后发现了巴法云,通过http传输图片十分方便。
因为有其他硬件来做图像采集与机器学习的部分,所以没有用esp32_cam,也就没有直接使用巴法云的例程。
上传过程
整体的上传过程,包括修改私钥、订阅话题等上面的官方教程写得十分清楚,这里写的是已有图片元数据后如何上传。
上传图片的格式
使用esp_camera的库后直接拍照,将结果返回给camera_fb_t类型的一个对象,例程直接post发送了该对象的buf与len属性,分别对应图片数据与长度,但没找到这个过程用的是什么格式,官方文档给了的描述。
二进制格式有些迷惑,试过了纯二进制与ascii表示的假二进制,经过测试,上传bmp格式的图片也能成功,下面jpg格式能正常上传并显示,其他格式还没有测试,但要保证上传的数据不能超过大约35KB,否则显示不出来。
//这是图片的”二进制“数据,它是jpg格式的。这里只列举了几行
unsigned char dataJ[4209] = {
0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x10, 0x0B, 0x0C, 0x0E, 0x0C, 0x0A, 0x10, 0x0E, 0x0D,
0x0E, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 0x1A, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1D,
0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33, 0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44, 0x57, ………………
部分代码
//fb指针指向图片首地址
unsigned char *fb=dataJ;
HTTPClient http;
//设置请求url
http.begin("http://images.bemfa.com/upload/v1/upimages.php");
http.addHeader("Content-Type", "image/jpg"); //设置传输类型为图片
http.addHeader("Authorization", uid); //第二个参数写自己的私钥
http.addHeader("Authtopic", "pic"); //第二个参数是巴法云里设置的主题名称
//POST发送,直接填入图片的首地址指针,必须是unsigned char类型,第二个参数是数据长度
int httpResponseCode = http.POST(fb, 4209);
if(httpResponseCode==200){
String response = http.getString();
Serial.println(response);
}
else{
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
//回收下次再用
http.end();
效果
可以直接看到图片了就,因为是直接定死的数组,所以全都相同,下一步就是串口收动态数据再发送了