很多时候遇到的bug并不难,也许因为提示比较陌生而让你以为这是一个没见过的bug,但仔细找找原因原来这个问题很简单,只是你太粗心了没注意到这点让bug产生了。这篇文章记录一下我因为各种粗心大意而导致的问题,警醒自己要保持一个良好的编码习惯不要再犯同样的错误浪费时间。
问题一 海康威视二次开发创建SOCKET出错
最近在使用海康威视的摄像头进行二次开发,在开始使用登陆功能时每次都提示错误44,错误提示如下图所示。
查了下海康威视的开发文档里的错误代码,44代表了创建SOCKET出错
部分登陆功能代码如下
private int loginDevice()
{
// get instance
m_oNetDvrDeviceInfoV30 = new NET_DVR_DEVICEINFO_V30();
if (null == m_oNetDvrDeviceInfoV30)
{
Log.e(TAG, "HKNetDvrDeviceInfoV30 new is failed!");
return -1;
}
Log.e(TAG, videoMsg.toString());
String strIP = videoMsg.getsIp();
int nPort = Integer.parseInt(videoMsg.getsPort());
String strUser =videoMsg.getsUser();
String strPsd = videoMsg.getsPwd();
Log.e(TAG, "[sIp=" + strIP + ", sPort=" + nPort + ", sUser=" + strUser
+ ", sPwd=" + strPsd + "]");
// call NET_DVR_Login_v30 to login on, port 8000 as default
int iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(strIP, nPort, strUser, strPsd, m_oNetDvrDeviceInfoV30);
if (iLogID < 0)
{
Log.e(TAG, "NET_DVR_Login is failed!Err:" + HCNetSDK.getInstance().NET_DVR_GetLastError());
return -1;
}
if(m_oNetDvrDeviceInfoV30.byChanNum > 0)
{
m_iStartChan = m_oNetDvrDeviceInfoV30.byStartChan;
m_iChanNum = m_oNetDvrDeviceInfoV30.byChanNum;
}
else if(m_oNetDvrDeviceInfoV30.byIPChanNum > 0)
{
m_iStartChan = m_oNetDvrDeviceInfoV30.byStartDChan;
m_iChanNum = m_oNetDvrDeviceInfoV30.byIPChanNum + m_oNetDvrDeviceInfoV30.byHighDChanNum * 256;
}
Log.e(TAG, "NET_DVR_Login is Successful!");
return iLogID;
}
而错误的地方就在这里
int iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(strIP, nPort, strUser, strPsd, m_oNetDvrDeviceInfoV30);
我反复看了很久,这里在使用ip和端口号创建SOCKET失败,是不是我的ip和端口号错误了,但看了很多遍发现都没有错误,还想了很多其他跟IP和端口号有关的可能性原因,发现都没问题,最后还是不把注意力放在IP和端口号上了,就放在这一句代码上,想着想着,突然想到。。。。这个好像是要联网来着!!!!于是马上把联网权限给补上
<uses-permission android:name="android.permission.INTERNET"/>
点击运行,,,发现终于可以了!!
一个十分简单的问题。。。。。。忏悔中。。。