2013-03-15 2 views
4

내가 반송파 신호 강도를 알아 사용한 코드입니다 : 그것은 나에게주고있다캐리어 신호 강도를 찾는 방법 프로그래밍 방식으로 여기

int getSignalStrength() 
{ 
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY); 
    int (*CTGetSignalStrength)(); 
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength"); 
    if(CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength"); 
    int result = CTGetSignalStrength(); 
    dlclose(libHandle); 
    return result; 
} 

100 60 사이의 값을,하지만 난 신호 강도를 테스트 할 때 이 기기를 *3001#12345#* 번으로 부르면 -65으로 표시됩니다. 아래 스크린 샷을 첨부했습니다. getSignalStrength()에서 오는 값이 정확합니까? 그렇다면 항상 양수 값을 반환하는 이유는 무엇입니까?

enter image description here

+0

을하지 않을 수 있음을 주목 this

에 따른 선형 방식으로 신호 강도를 측정하지 않는다 상대 비교를 제외하고 측정은 의미가 없습니다. –

답변

7

getSignalStrength()은 음의 dB 감쇠를 나타낸다. - (- 60) == 60입니다. 호출은 일반적으로 0보다 작은 측정 값으로 표시됩니다. 예, 이러한 종류의 변형이 일반적입니다. 엄격하게 통제 된 조건에서도 +/- 20 데시벨을 얻을 수 있습니다. 당신이 그것을 고칠 수있는 한 가지 방법은 시간이 지남에 따라 일련의 측정을하고, 매 초마다 말하며, 마지막 10 개 정도의 측정치의 실행 목록을 유지하는 것입니다. 그런 다음 평균 또는 중간 값 또는 다른 통계를보고하십시오. 내 경험상 이것은 변화를 많이 줄입니다. 표준 편차를 수행하여 안정성 측정을 제공 할 수도 있습니다.

+0

'getSignalStrength()'가 GSM을 반환하는지 알 수 있습니까? CDMA? 3G? 4G? LTE? 신호 강도 데이터? – Cole

3

getSignalStrength()은 부정적인 스케일로 결과를 제공합니다. 차이는 하이 패스 필터를 사용하여 제어 할 수 있습니다.

최근 10 회의 관측 결과를 수집해야합니다. 새로운 관찰을 추가 할 때 마지막 10 회의 관찰 평균을 취하십시오. 0.1을 곱합니다. 현재 판독 값을 취하여 0.9로 곱하십시오. 둘 다 추가하십시오. 총 관측치가 10보다 큰 경우 다음 계산을 위해 가장 오래된 관측치를 제거합니다.

결과를 더욱 신뢰할 수있게 만들고 신호 강도의 갑작스러운 변화를 효과적으로 처리 할 수 ​​있습니다.

+0

그것은 수치를 정규화하기위한 수학 공식입니까? 즉, 측정 값의 표준화에 대해 더 자세히 읽을 수있는 곳은 어디입니까? –

1

많은 신호에 대해 getSignalStrength()은 하이 패스 필터 알고리즘과 함께 사용해야합니다.

또한 일정 시간 (10-15 회 연속 측정) 동안 평균 측정 값을 가져야합니다. 그리고 부정적인 결과를 제공한다는 것이 정상적인, 텔레포니 dB 신호 CoreTelephony에 CTGetSignalStrength() 해당 ;-)

5

내 관찰처럼, 그것은 캐리어의 신호 강도의 RSSI(Received Signal Strength Indication) 값을 반환한다. 이 실험은 this에 따른 이동 통신사의 "신호 강도 비율"이라고 생각하는 0 - 100 범위의 값을 반환합니다.

또한 아이폰 OS는 I 또한 우리는 상태 막대의 5 개 개의 막대가 되어도, RSSI 값은 단위 임의없이 100

관련 문제