我想用esp8266访问http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true
这个api,然后将返回的ip“202.101.102.194”和city“福州市”,显示在与esp8266连接的墨水屏上用来表示定位。ip值的数字能正常显示,而city的“福州市”却不能显示(和中文有关的包括pro也不能显示但是region偶尔能莫名其妙显示个“琅”字),本人由于大学第一次接触esp8266,希望能帮我看看哪里出了问题,应该要怎么改,谢谢。
arduino串口显示的是这个,
我定义了一个string类型的全局变量用来记录city的值,在displaytext()中使用了下面代码转换成const char*,用来配合u8g2.drawUTF8显示文字以下是我的全部代码:
#include <GxEPD2_BW.h>
#include <Adafruit_GFX.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Wire.h>
//#define BME280_ADDRESS 0x76
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=D8*/ 15, /*DC=D3*/ 4, /*RST=D4*/ 2, /*BUSY=D2*/ 5));
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;
//extern const uint8_t u8g2_mfyuanhei_16_gb2312[] PROGMEM;
#include "u8g2_mfyuanhei_16_gb2312.c"
#include "u8g2_mfxinran_92_number.c"
String city_rl="";
String ip_rl="";
void setup()
{
lianwang();
ipfrom();
displaytext();
}
void loop() {
}
void displaytext(){
display.init(115200);
display.setRotation(0);
u8g2Fonts.begin(display);
int16_t dataWidth;
String str = "2023-5-13";
const char* character = str.c_str();
const char* ip_rll=ip_rl.c_str();
const char* city_rll=city_rl.c_str();
uint8_t size = 24;
display.firstPage();
uint8_t SCREEN_WIDTH=400;
do
{
uint8_t size = 101;
u8g2Fonts.setBackgroundColor(0xff);
u8g2Fonts.setForegroundColor(0x00);
u8g2Fonts.setFont(u8g2_mfyuanhei_16_gb2312);
dataWidth = u8g2Fonts.getUTF8Width(character);
u8g2Fonts.drawUTF8((SCREEN_WIDTH - dataWidth)/2, size, character);
Serial.printf("\ndataWidth: %d\n", dataWidth/8);
u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
dataWidth = u8g2Fonts.getUTF8Width("陶嘉骐制作");
u8g2Fonts.drawUTF8((SCREEN_WIDTH - dataWidth)/2, size*2, "陶嘉骐制作");
u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
u8g2Fonts.drawUTF8(250, 150, ip_rll);
u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
u8g2Fonts.drawUTF8(200, 200, city_rll);
const unsigned char gImage_weizhi[60] = { /* 0X00,0X01,0X14,0X00,0X14,0X00, */
0XFF,0X0F,0XF0,0XFC,0X03,0XF0,0XF8,0X01,0XFF,0XF0,0X00,0XFF,0XF0,0X60,0XF1,0XE0,
0XF0,0X70,0XE1,0XF8,0X7F,0XE0,0XF0,0XFF,0XF0,0XF0,0XF7,0XF0,0X00,0XF0,0XF8,0X01,
0XFF,0XF8,0X01,0XFF,0XFC,0X03,0XFF,0XFC,0X03,0XF8,0XFE,0X07,0XFF,0XFE,0X0F,0XFF,
0XFF,0X0F,0XFF,0XFF,0X9F,0XFE,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,};
display.drawInvertedBitmap(350, 0, gImage_weizhi, 20, 20, GxEPD_BLACK); // 绘制反色位图
}
while (display.nextPage());
display.hibernate();
}
void lianwang(){
Serial.begin(115200);
WiFi.begin("wif","11113333");
while(WiFi.status()!=WL_CONNECTED){
delay(500);
Serial.print("..");
}
Serial.println("ip address");
Serial.println(WiFi.localIP());
}
void ipfrom(){
HTTPClient http;
WiFiClient wifiClient;
if (WiFi.status() == WL_CONNECTED){
http.begin(wifiClient,"http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true");
int httpCode = http.GET();
Serial.print(httpCode);
http.setUserAgent("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36");
if (httpCode==HTTP_CODE_OK)
{
String respone = http.getString();
//Serial.println(respone);
StaticJsonDocument<384> doc;
DeserializationError error = deserializeJson(doc, respone);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return ;
}
const char* ip = doc["ip"]; // "202.101.102.194"
const char* pro = doc["pro"]; // "福建省"
const char* proCode = doc["proCode"]; // "350000"
const char* city = doc["city"]; // "福州市"
const char* cityCode = doc["cityCode"]; // "350100"
const char* region = doc["region"]; // nullptr
const char* regionCode = doc["regionCode"]; // "0"
const char* addr = doc["addr"]; // "福建省福州市 电信"
const char* regionNames = doc["regionNames"]; // nullptr
const char* err = doc["err"]; // nullptr
ip_rl=ip;
city_rl=city;
Serial.println(ip_rl);
Serial.println(city_rl);
http.end();
}
}
}